package jp.co.menox.tmserver.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.SortDirection;

import jp.co.menox.tmcommon.common.DataConst;
import jp.co.menox.tmcommon.meta.LendingHistoryMeta;
import jp.co.menox.tmcommon.model.LendingHistory;

/**
 * 貸し借り履歴用dao
 * @author
 *
 */
public class LendingHistoryDao extends TmServerDaoBase<LendingHistory>{

    private String nameOfLendingId;
    private String nameOfLendingUser;
    private String nameOfBorrowingUser;
    private String nameOfStatusType;
    private String nameOfCancelUser;
    private String nameOfSharingId;
    private String nameOfWasDeleted;
    private String nameOfCreated;

    {
        LendingHistoryMeta meta = LendingHistoryMeta.get();
        nameOfLendingId = meta.lendingId.getName();
        nameOfLendingUser = meta.lendingUser.getName();
        nameOfBorrowingUser = meta.borrowingUser.getName();
        nameOfStatusType = meta.statusType.getName();
        nameOfCancelUser = meta.cancelUser.getName();
        nameOfSharingId = meta.sharingId.getName();
        nameOfWasDeleted = meta.wasDeleted.getName();
        nameOfCreated = meta.created.getName();
    }


    // **** Query用メソッド
    
    // TODO: ここを充実させるか


    // **** 使用中チェック（マスタ編集用）

    /*
     * 貸したいものIDから該当するレコード件数を取得する（有効なもの）。<br />
     * @param lendingId
     * @return 
     */
    public int getSizeInLendingId(long lendingId) {
        List<Key> result = query()
                .filter(nameOfLendingId, Query.FilterOperator.EQUAL, lendingId)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asKeyList();
        if (result == null) {
            return 0;
        }
        return result.size();
    }
    
    /*
     * ステータスから該当するレコード件数を取得する（有効なもの）。
     * @param statusType
     * @return 
     */
    public int getSizeInStatusType(int statusType) {
        List<Key> result = query()
                .filter(nameOfStatusType, Query.FilterOperator.EQUAL, statusType)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asKeyList();
        if (result == null) {
            return 0;
        }
        return result.size();
    }
    
    /*
     * 貸与者IDから該当する承認済・貸出中のレコードを取得する（有効なもの）。<br />
     * @param lendingUser
     * @return 
     */
    public List<LendingHistory> getLendingListForApp(long lendingUser) {
        List<LendingHistory> result = query()
                .filter(nameOfLendingUser, Query.FilterOperator.EQUAL, lendingUser)
                .filter(nameOfStatusType, Query.FilterOperator.IN, 
                    Arrays.asList(DataConst.STATUS_SYOUNINZUMI, DataConst.STATUS_KASHIDASHITYU))
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)                
                .sort(nameOfCreated, SortDirection.ASCENDING)
                .asList();
        return result;
    }

    public List<LendingHistory> getLendingList(long lendingUser) {
        List<LendingHistory> result = query()
                .filter(nameOfLendingUser, Query.FilterOperator.EQUAL, lendingUser)
                .filter(nameOfStatusType, Query.FilterOperator.IN, 
                    Arrays.asList(
                        DataConst.STATUS_MISYOUNIN, 
                        DataConst.STATUS_SYOUNINZUMI, 
                        DataConst.STATUS_KASHIDASHITYU))
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)                
                .sort(nameOfCreated, SortDirection.ASCENDING)
                .asList();
        return result;
    }
    
    /*
     * 借用者IDから該当する承認済・貸出中のレコードを取得する（有効なもの）。<br />
     * @param borrowingUser
     * @return 
     */
    public List<LendingHistory> getBorrowingListForApp(long borrowingUser) {
        List<LendingHistory> result = query()
                .filter(nameOfBorrowingUser, Query.FilterOperator.EQUAL, borrowingUser)
                .filter(nameOfStatusType, Query.FilterOperator.IN, 
                    Arrays.asList(DataConst.STATUS_SYOUNINZUMI, DataConst.STATUS_KASHIDASHITYU))
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)                
                .sort(nameOfCreated, SortDirection.ASCENDING)
                .asList();

        return result;
    }
    
    /*
     * 借用者IDから該当する承認済・貸出中のレコードを取得する（有効なもの）。<br />
     * @param borrowingUser
     * @return 
     */
    public List<LendingHistory> getBorrowingList(long borrowingUser) {
//        List<LendingHistory> result = query()
//                .filter(nameOfBorrowingUser, Query.FilterOperator.EQUAL, borrowingUser)
//                .filter(nameOfStatusType, Query.FilterOperator.IN, 
//                    Arrays.asList(DataConst.STATUS_SYOUNINZUMI, DataConst.STATUS_KASHIDASHITYU))
//                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)                
//                .sort(nameOfCreated, SortDirection.ASCENDING)
//                .asList();
        
        List<LendingHistory> result = query()
                .filter(nameOfBorrowingUser, Query.FilterOperator.EQUAL, borrowingUser)
                .filter(nameOfStatusType, Query.FilterOperator.IN, 
                    Arrays.asList(
                        DataConst.STATUS_MISYOUNIN, 
                        DataConst.STATUS_SYOUNINZUMI, 
                        DataConst.STATUS_KASHIDASHITYU))
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)                
                .sort(nameOfCreated, SortDirection.ASCENDING)
                .asList();
        return result;
    }
    
    // **** サンプルメソッド
    
    /*
     * 貸したいものIDから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param lendingId
     * @return 
     */
    @Deprecated
    public List<LendingHistory> getAllInLendingId(long lendingId) {
        List<LendingHistory> result = query()
                .filter(nameOfLendingId, Query.FilterOperator.EQUAL, lendingId)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<LendingHistory>();
        }
        return result;
    }
    
    /*
     * 貸与者IDから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param lendingUser
     * @return 
     */
    @Deprecated
    public List<LendingHistory> getAllInLendingUser(long lendingUser) {
        List<LendingHistory> result = query()
                .filter(nameOfLendingUser, Query.FilterOperator.EQUAL, lendingUser)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<LendingHistory>();
        }
        return result;
    }
    
    /*
     * 借用者IDから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param borrowingUser
     * @return 
     */
    @Deprecated
    public List<LendingHistory> getAllInBorrowingUser(long borrowingUser) {
        List<LendingHistory> result = query()
                .filter(nameOfBorrowingUser, Query.FilterOperator.EQUAL, borrowingUser)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<LendingHistory>();
        }
        return result;
    }
    
    /*
     * ステータスから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param statusType
     * @return 
     */
    @Deprecated
    public List<LendingHistory> getAllInStatusType(int statusType) {
        List<LendingHistory> result = query()
                .filter(nameOfStatusType, Query.FilterOperator.EQUAL, statusType)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<LendingHistory>();
        }
        return result;
    }
    
    /*
     * キャンセルユーザから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param cancelUser
     * @return 
     */
    @Deprecated
    public List<LendingHistory> getAllInCancelUser(long cancelUser) {
        List<LendingHistory> result = query()
                .filter(nameOfCancelUser, Query.FilterOperator.EQUAL, cancelUser)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<LendingHistory>();
        }
        return result;
    }
    
    /*
     * シェアリングIDから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param sharingId
     * @return 
     */
    @Deprecated
    public List<LendingHistory> getAllInSharingId(String sharingId) {
        List<LendingHistory> result = query()
                .filter(nameOfSharingId, Query.FilterOperator.EQUAL, sharingId)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<LendingHistory>();
        }
        return result;
    }
    
}
